/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compras.beans;

import entities.Estimacion;
import entities.Producto;
import entities.ProductoTalla;
import entities.Usuario;
import facades.EstimacionFacade;
import facades.LineaPedidoFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import productos.datamodel.ListaProductos;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named(value = "estimacionesProductoBean")
@SessionScoped
public class EstimacionesProductoBean extends ListaProductos implements Serializable {
    @Inject
    private EstimacionFacade estimacionFacade;
    @Inject
    @UsuarioLogeado
    Usuario usuarioLogeado;
    @Inject
    private LineaPedidoFacade lineaPedidoFacade;
    private Map<Integer, Estimacion> bufferEstimaciones;
    private Map<Integer, Integer> ventasProductos;
    
    public EstimacionesProductoBean(){
        bufferEstimaciones=new HashMap<Integer,Estimacion>();
        ventasProductos=new HashMap<Integer,Integer>();
    }
    
    public Integer recuperarEstimacionDeProducto(Producto p){
        Integer i=estimacionFacade.getCantidadEstimadaDeProducto(p);
        return i;
    }
    
    public Integer recuperarCandidadVendidaDeProducto(Producto p){
        return lineaPedidoFacade.getCantidadVendidaDeProducto(p);
    }
    
    public List<Producto> envolverProducto(Producto p){
        List<Producto> wrap=new ArrayList<Producto>();
        wrap.add(p);
        return wrap;
    }
    
    public void guardarEstimacion(ProductoTalla pt){
        Date ahora=new Date();
        Estimacion e=recuperarEstimacionDeProductoTalla(pt);
        if(e.getIdEstimacion()==null){
            if(e.getCantidad()>0){
                e.setFechaCreacion(ahora);
                e.setFechaUltimaModificacion(ahora);
                e.setUltimoUsuario(usuarioLogeado);
                e.setUsuarioCreador(usuarioLogeado);
                estimacionFacade.create(e);
                e.getProductoTalla().getEstimacionList().clear();
                e.getProductoTalla().getEstimacionList().add(e);
            }
        }
        else{
            if(e.getCantidad()>0){
                e.setFechaUltimaModificacion(ahora);
                e.setUltimoUsuario(usuarioLogeado);
                estimacionFacade.edit(e);
                e.getProductoTalla().getEstimacionList().clear();
                e.getProductoTalla().getEstimacionList().add(e);
            }
            else{
                Estimacion nuevaEstimacion=new Estimacion();
                nuevaEstimacion.setProductoTalla(e.getProductoTalla());
                nuevaEstimacion.setCantidad(0);
                estimacionFacade.remove(e);
            }
        }
    }
    
    public Estimacion recuperarEstimacionDeProductoTalla(ProductoTalla pt){
        if(pt!=null){
            if(!bufferEstimaciones.containsKey(pt.getIdProductoTalla())){
                Estimacion estimacion=estimacionFacade.getEstimacionDeProductoTalla(pt);
                if(estimacion==null){
                    estimacion=new Estimacion();
                    estimacion.setCantidad(0);
                    estimacion.setProductoTalla(pt);
                }
                bufferEstimaciones.put(pt.getIdProductoTalla(),estimacion);
            }
            return bufferEstimaciones.get(pt.getIdProductoTalla());
        }
        else{
            return null;
        }
    }
    
    public Integer recuperarCantidadVendidaDeProductoTalla(ProductoTalla pt){
        Integer cantidad=null;
        if(pt!=null){
            if(!ventasProductos.containsKey(pt.getIdProductoTalla())){
                cantidad=lineaPedidoFacade.getCantidadVendidaDeProductoTalla(pt);
                ventasProductos.put(pt.getIdProductoTalla(), cantidad);
            }
            cantidad=ventasProductos.get(pt.getIdProductoTalla());
        }
        return cantidad;
    }

    /**
     * @return the ventasProductos
     */
    public Map<Integer, Integer> getVentasProductos() {
        return ventasProductos;
    }

    /**
     * @param ventasProductos the ventasProductos to set
     */
    public void setVentasProductos(Map<Integer, Integer> ventasProductos) {
        this.ventasProductos = ventasProductos;
    }
       
}
